Android笔记:Socket客户端收发数据

您所在的位置:网站首页 android socket接收数据 Android笔记:Socket客户端收发数据

Android笔记:Socket客户端收发数据

#Android笔记:Socket客户端收发数据| 来源: 网络整理| 查看: 265

转载: 

http://www.cnblogs.com/shaocm/p/3528346.html

client.xml

   

   

   

   

           

                                  

 

client.java

import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java.net.SocketException; import java.net.UnknownHostException;

import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView;

public class Client extends Activity {     private String TAG = "===Client===";     private String TAG1 = "===Send===";     private TextView tv1 = null;     Handler mhandler;     Handler mhandlerSend;     boolean isRun = true;     EditText edtsendms;     Button btnsend;     private String sendstr = "";     SharedPreferences sp;     Button btnSetting;     private Context ctx;     Socket socket;     PrintWriter out;     BufferedReader in;     SocThread socketThread;

    @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.client);         tv1 = (TextView) findViewById(R.id.tv1);         btnsend = (Button) findViewById(R.id.button1);         ctx = Client.this;         edtsendms = (EditText) findViewById(R.id.editText1);         btnSetting = (Button) findViewById(R.id.button2);         mhandler = new Handler() {             @Override             public void handleMessage(Message msg) {                 try {                     MyLog.i(TAG, "mhandler接收到msg=" + msg.what);                     if (msg.obj != null) {                         String s = msg.obj.toString();                         if (s.trim().length() > 0) {                             MyLog.i(TAG, "mhandler接收到obj=" + s);                             MyLog.i(TAG, "开始更新UI");                             tv1.append("Server:" + s);                             MyLog.i(TAG, "更新UI完毕");                         } else {                             Log.i(TAG, "没有数据返回不更新");                         }                     }                 } catch (Exception ee) {                     MyLog.i(TAG, "加载过程出现异常");                     ee.printStackTrace();                 }             }         };         mhandlerSend = new Handler() {             @Override             public void handleMessage(Message msg) {                 try {                     MyLog.i(TAG, "mhandlerSend接收到msg.what=" + msg.what);                     String s = msg.obj.toString();                     if (msg.what == 1) {                         tv1.append("\n ME: " + s + "      发送成功");                     } else {                         tv1.append("\n ME: " + s + "     发送失败");                     }                 } catch (Exception ee) {                     MyLog.i(TAG, "加载过程出现异常");                     ee.printStackTrace();                 }             }         };         startSocket();         btnsend.setOnClickListener(new OnClickListener() {             @Override             public void onClick(View v) {                 // 发送数据                 MyLog.i(TAG, "准备发送数据");                 sendstr = edtsendms.getText().toString().trim();                 socketThread.Send(sendstr);

            }         });         btnSetting.setOnClickListener(new OnClickListener() {

            @Override             public void onClick(View v) {                 // 跳转到设置界面                 Intent intent = new Intent();                 intent.setClass(Client.this, Setting.class);                 MyLog.i(TAG, "跳转至设置界面");                 ctx.startActivity(intent);// 打开新界面

            }         });

    }

    public void startSocket() {         socketThread = new SocThread(mhandler, mhandlerSend, ctx);         socketThread.start();     }

    @Override     public boolean onCreateOptionsMenu(Menu menu) {         // Inflate the menu; this adds items to the action bar if it is present.         getMenuInflater().inflate(R.menu.client, menu);         return true;     }

    private void stopSocket() {         socketThread.isRun = false;         socketThread.close();         socketThread = null;         MyLog.i(TAG, "Socket已终止");     }

    @Override     protected void onStart() {         super.onStart();         Log.e(TAG, "start onStart~~~");     }

    @Override     protected void onRestart() {         super.onRestart();         Log.e(TAG, "start onRestart~~~");         startSocket();     }

    @Override     protected void onResume() {         super.onResume();         Log.e(TAG, "start onResume~~~");     }

    @Override     protected void onPause() {         super.onPause();         Log.e(TAG, "start onPause~~~");     }

    @Override     protected void onStop() {         super.onStop();         Log.e(TAG, "start onStop~~~");         stopSocket();     }

    @Override     protected void onDestroy() {         super.onDestroy();         Log.e(TAG, "start onDestroy~~~");

    }

}

socket线程:SocThread.java

import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException;

import android.content.Context; import android.content.SharedPreferences; import android.os.Handler; import android.os.Message; import android.util.Log;

public class SocThread extends Thread {     private String ip = "10.0.0.113";     private int port = 13000;     private String TAG = "socket thread";     private int timeout = 10000;

    public Socket client = null;     PrintWriter out;     BufferedReader in;     public boolean isRun = true;     Handler inHandler;     Handler outHandler;     Context ctx;     private String TAG1 = "===Send===";     SharedPreferences sp;

    public SocThread(Handler handlerin, Handler handlerout, Context context) {         inHandler = handlerin;         outHandler = handlerout;         ctx = context;         MyLog.i(TAG, "创建线程socket");     }

    /**      * 连接socket服务器      */     public void conn() {

        try {             initdate();             Log.i(TAG, "连接中……");             client = new Socket(ip, port);             client.setSoTimeout(timeout);// 设置阻塞时间             MyLog.i(TAG, "连接成功");             in = new BufferedReader(new InputStreamReader(                     client.getInputStream()));             out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(                     client.getOutputStream())), true);             MyLog.i(TAG, "输入输出流获取成功");         } catch (UnknownHostException e) {             MyLog.i(TAG, "连接错误UnknownHostException 重新获取");             e.printStackTrace();             conn();         } catch (IOException e) {             MyLog.i(TAG, "连接服务器io错误");             e.printStackTrace();         } catch (Exception e) {             MyLog.i(TAG, "连接服务器错误Exception" + e.getMessage());             e.printStackTrace();         }     }

    public void initdate() {         sp = ctx.getSharedPreferences("SP", ctx.MODE_PRIVATE);         ip = sp.getString("ipstr", ip);         port = Integer.parseInt(sp.getString("port", String.valueOf(port)));         MyLog.i(TAG, "获取到ip端口:" + ip + ";" + port);     }

    /**      * 实时接受数据      */     @Override     public void run() {         MyLog.i(TAG, "线程socket开始运行");         conn();         MyLog.i(TAG, "1.run开始");         String line = "";         while (isRun) {             try {                 if (client != null) {                     MyLog.i(TAG, "2.检测数据");                     while ((line = in.readLine()) != null) {                         MyLog.i(TAG, "3.getdata" + line + " len=" + line.length());                         MyLog.i(TAG, "4.start set Message");                         Message msg = inHandler.obtainMessage();                         msg.obj = line;                         inHandler.sendMessage(msg);// 结果返回给UI处理                         MyLog.i(TAG1, "5.send to handler");                     }

                } else {                     MyLog.i(TAG, "没有可用连接");                     conn();                 }             } catch (Exception e) {                 MyLog.i(TAG, "数据接收错误" + e.getMessage());                 e.printStackTrace();             }         }     }

    /**      * 发送数据      *      * @param mess      */     public void Send(String mess) {         try {             if (client != null) {                 MyLog.i(TAG1, "发送" + mess + "至"                         + client.getInetAddress().getHostAddress() + ":"                         + String.valueOf(client.getPort()));                 out.println(mess);                 out.flush();                 MyLog.i(TAG1, "发送成功");                 Message msg = outHandler.obtainMessage();                 msg.obj = mess;                 msg.what = 1;                 outHandler.sendMessage(msg);// 结果返回给UI处理             } else {                 MyLog.i(TAG, "client 不存在");                 Message msg = outHandler.obtainMessage();                 msg.obj = mess;                 msg.what = 0;                 outHandler.sendMessage(msg);// 结果返回给UI处理                 MyLog.i(TAG, "连接不存在重新连接");                 conn();             }

        } catch (Exception e) {             MyLog.i(TAG1, "send error");             e.printStackTrace();         } finally {             MyLog.i(TAG1, "发送完毕");

        }     }

    /**      * 关闭连接      */     public void close() {         try {             if (client != null) {                 MyLog.i(TAG, "close in");                 in.close();                 MyLog.i(TAG, "close out");                 out.close();                 MyLog.i(TAG, "close client");                 client.close();             }         } catch (Exception e) {             MyLog.i(TAG, "close err");             e.printStackTrace();         }

    } }

说明:

1.接收数据并读取时的推荐使用BufferedReader 会比直接读取要效率高些 2.BufferedReader默认大小:8192个字节=84Mbit,utf-8下等于4596个字符 一般足够用了 3.接收数据使用的是ReadLine,实际测试中直接发送无法接收到数据,后来发现必须在发送数据的末尾加入'\n'换行符才能识别到,目前ReadLine是行读取没有了行标志无法读取到数据 4.中文乱码问题 字符编码格式的问题 可以使用GB2312格式解析   in= new BufferedReader(new InputStreamReader(socket.getInputStream(), "gb2312")); 转载: http://www.cnblogs.com/shaocm/p/3528346.html DEMO下载地址: http://download.csdn.net/detail/w495800598/8616121 


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3